package org.owasp.webgoat.util;

import java.util.BitSet;

/*******************************************************************************
 * 
 * 
 * This file is part of WebGoat, an Open Web Application Security Project
 * utility. For details, please see http://www.owasp.org/
 * 
 * Copyright (c) 2002 - 2007 Bruce Mayhew
 * 
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation; either version 2 of the License, or (at your option) any later
 * version.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
 * Place - Suite 330, Boston, MA 02111-1307, USA.
 * 
 * Getting Source ==============
 * 
 * Source for this application is maintained at code.google.com, a repository
 * for free software projects.
 * 
 * For details, please see http://code.google.com/p/webgoat/
 *
 *@author     jwilliams@aspectsecurity.com
 *@created    November 6, 2002
 */
public class ThreadWatcher implements Runnable
{

    // time to live in milliseconds
    private BitSet myInterrupted;

    private Process myProcess;

    private int myTimeout;


    /**
     *  Constructor for the ThreadWatcher object
     *
     *@param  p            Description of the Parameter
     *@param  interrupted  Description of the Parameter
     *@param  timeout      Description of the Parameter
     */
    public ThreadWatcher(Process p, BitSet interrupted, int timeout)
    {
	myProcess = p;

	// thread used by whoever constructed this watcher
	myTimeout = timeout;
	myInterrupted = interrupted;
    }


    /*
     *  Interrupt the thread by marking the interrupted bit and killing the process
     */

    /**
     *  Description of the Method
     */
    public void interrupt()
    {
	myInterrupted.set(0);

	// set interrupted bit (bit 0 of the bitset) to 1
	myProcess.destroy();

	/*
	 *  try
	 *  {
	 *  myProcess.getInputStream().close();
	 *  }
	 *  catch( IOException e1 )
	 *  {
	 *  / do nothing -- input streams are probably already closed
	 *  }
	 *  try
	 *  {
	 *  myProcess.getErrorStream().close();
	 *  }
	 *  catch( IOException e2 )
	 *  {
	 *  / do nothing -- input streams are probably already closed
	 *  }
	 *  myThread.interrupt();
	 */
    }


    /**
     *  Main processing method for the ThreadWatcher object
     */
    public void run()
    {
	try
	{
	    Thread.sleep(myTimeout);
	}
	catch (InterruptedException e)
	{
	    // do nothing -- if watcher is interrupted, so is thread
	}

	interrupt();
    }
}
